#ifndef QGEOTILEFETCHERQGC_H
#define QGEOTILEFETCHERQGC_H

#include <QtLocation/private/qgeotilefetcher_p.h>
#include <QTimer>
#include "QGCMapUrlEngine.h"

class QGeoTiledMappingManagerEngine;
class QNetworkAccessManager;

/**
 * @brief QGC地图瓦片获取器
 * 
 * QGeoTileFetcherQGC类负责从网络获取地图瓦片数据，继承自Qt的QGeoTileFetcher类。
 * 该类使用QNetworkAccessManager来执行网络请求，并通过QGC地图引擎构建URL来获取地图瓦片。
 */
class QGeoTileFetcherQGC : public QGeoTileFetcher
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数
     * @param parent 父对象，通常为QGeoTiledMappingManagerEngine实例
     */
    explicit QGeoTileFetcherQGC             (QGeoTiledMappingManagerEngine *parent = 0);
    
    /**
     * @brief 析构函数
     */
    ~QGeoTileFetcherQGC();
    
public slots:
    /**
     * @brief 超时处理槽函数
     * 
     * 定期检查网络连接状态
     */
    void                    timeout         ();
    
private:
    /**
     * @brief 获取地图瓦片图像, 纯虚函数，需要实现
     *        QGeoTileFetcher类中会调用这个函数，QGeoTiledMappingManagerEngineQGC创建实列,
     *        Qt Location 框架会调用这个函数.
     * @param spec 地图瓦片规格信息，包括x、y坐标和缩放级别
     *        QGeoTileSpec类是Qt位置模块中的一个私有类，用于指定地图瓦片的规格。它使用的坐标系和标准是：
     *        1.Web Mercator投影坐标系（EPSG:3857）：
     *          * 这是Google Maps、Bing Maps、OpenStreetMap等主流在线地图服务使用的标准投影
     *          * 它是墨卡托投影的一种变体，专门为Web地图显示而优化
     *        2.XYZ瓦片寻址方案：
     *          * X坐标：从左到右增加（0到2^zoom - 1）
     *          * Y坐标：从上到下增加（0到2^zoom - 1），原点在左上角
     *          * Zoom级别：缩放级别，决定了瓦片的总数（4^zoom）
     *        3.WGS84基准：
     *          * 地理坐标基于WGS84基准（EPSG:4326）
     *          * Web Mercator投影坐标系是从WGS84地理坐标转换而来的
     * @return QGeoTiledMapReply* 地图瓦片回复对象
     */
    QGeoTiledMapReply*      getTileImage    (const QGeoTileSpec &spec);
    
private:
    QNetworkAccessManager*  _networkManager; ///< 网络访问管理器，用于发送HTTP请求
    QTimer                  _timer;          ///< 定时器，用于定期检查网络状态
};

#endif // QGEOTILEFETCHERQGC_H